package com.cx.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;


import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @program: pms
 * @author: cx
 * @description: 实用工具类
 * @create: 2024-10-29 16:28
 **/
public class PracticalUtil {


    private static BufferedImage image;
    private static int imageWidth = 450;  //图片的宽度
    private static int imageHeight = 550; //图片的高度


    private static String qrcodeurl = "C:/qrcode/";


    /*
     * 生成二维码和条形码
     * */
    public static String createCode(String cardNum) throws IOException, WriterException {

        String barcodeText = "123456789012"; // 条形码内容 EAN-13 条形码需要13位数字

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
        //String qrCode = getQrCode(calendar, cardNum);
        String qrCode = cardNum;
//        String format = StringUtils.format("{}/{}", DateUtils.datePath(), UUID.randomUUID() + ".jpg");
        String format = String.valueOf(new Date().getTime());
        format = format + ".jpg";

        //生成二维码
        QrCodeUtil.generate(qrCode, 300, 300, FileUtil.file("F:\\test\\" + format));

        //生成条形码
        /*条形码本质上是一个表示数字或字母字符串的图形化编码。条形码本身并不包含任何商品信息，它只是一个唯一的标识符。
        当扫条形码时，条形码扫描器会读取这个标识符，然后查询对应的数据库或服务来获取商品信息。*/
        //generateBarcode(barcodeText, 300, 100, "F:\\test\\" + format);

        return format;
    }

    /*
     *生成条形码方法
     */
    public static void generateBarcode(String text, int width, int height, String filePath) throws WriterException, IOException, WriterException {
        Code128Writer barcodeWriter = new Code128Writer();
        BitMatrix bitMatrix = barcodeWriter.encode(text, BarcodeFormat.CODE_128, width, height);

        Path path = FileSystems.getDefault().getPath(filePath);
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    }


    /*
     * 生成标签*/
    public static void label() {

        int H_Company = 20;

        // 这行代码创建了一个宽度为 imageWidth，高度为 imageHeight 的 BufferedImage 对象，图像类型为 TYPE_INT_RGB，表示使用 RGB 色彩模型。
        image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
        //通过 createGraphics 方法获取一个 Graphics2D 对象，用于在该图像上进行绘制操作。
        Graphics2D g2d = image.createGraphics();

        //设置绘制颜色为白色，并填充整个图像区域。
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, imageWidth, imageHeight);


        /*Graphics2D 是 Graphics 的子类，继承了 Graphics 的所有方法，并添加了许多高级图形处理功能。
         使用 Graphics2D 可以直接访问高级功能，而使用 Graphics 时需要进行类型转换才能访问这些功能。*/
        Graphics typeLeft = image.createGraphics();
        // 设置typeLeft 的颜色为白色
        typeLeft.setColor(new Color(255, 255, 255));

//        作用：使用当前颜色填充一个矩形区域。
//        参数：
//        0：矩形的 x 坐标（左上角）。
//        280：矩形的 y 坐标（左上角）。
//        imageWidth：矩形的宽度。
//        H_Company：矩形的高度。
//        在图像的指定位置（x=0, y=280）绘制一个宽度为 imageWidth、高度为 H_Company 的白色矩形，覆盖该区域的任何内容。
        typeLeft.fillRect(0, 280, imageWidth, H_Company);
//        作用：设置 typeLeft 的颜色为黑色。
//        意义：Graphics 对象的绘制操作将使用当前设置的颜色。在这里，我们将颜色设置为黑色 (RGB 值为 0, 0, 0)。
        typeLeft.setColor(Color.red);
//        typeLeft.setXORMode(Color.red);
        /*
        * 作用：创建一个新的 Font 对象 titleFontleft。
              参数：
              宋体"：字体名称。
              Font.PLAIN：字体样式（普通）。
              25：字体大小。
              意义：定义了将用于绘制文本的字体样式和大小。*/
        Font titleFontleft = new Font("宋体", Font.PLAIN, 25);
        typeLeft.setFont(titleFontleft);
//        作用：设置 typeLeft 的文本抗锯齿选项。
//        参数：
//        RenderingHints.KEY_TEXT_ANTIALIASING：渲染提示键，用于指定文本抗锯齿的选项。
//        RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB：渲染提示值，启用 LCD 水平文本抗锯齿。
//        意义：通过将 typeLeft 强制转换为 Graphics2D 对象，并设置渲染提示，我们可以启用文本抗锯齿，以提高文本绘制的质量，使其更加平滑和清晰。
        ((Graphics2D) typeLeft).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);

//        imageWidth / 2 - 60：文本绘制的 x 坐标。imageWidth / 2 表示图像宽度的一半，即图像的水平中心位置，减去 60 像素是为了将文本向左移动，使其偏离中心位置。
//        imageHeight - 5：文本绘制的 y 坐标。imageHeight 表示图像的高度，减去 5 像素是为了将文本绘制在图像底部上方 5 像素的位置
        typeLeft.drawString("汉高", imageWidth / 2 - 60, imageHeight - 5);
        typeLeft.drawString("系统外物料", imageWidth / 2 - 80, 40);


        //中间文字部分
        Graphics centerword = image.createGraphics();
        centerword.setColor(Color.black);
        centerword.drawString("你好", 30, 140);
        centerword.drawString("我要", 30, 180);
        //包装规格
        centerword.drawString("绘制一个", 30, 260);
        centerword.drawString("图像", 30, 300);
        centerword.drawString("芜湖", 30, 340);


        createImage("F:\\test\\aaaa.jpg");

    }


    //生成图片文件
    public static void createImage(String fileLocation) {
        BufferedOutputStream bos = null;
        if (image != null) {
            try {
                FileOutputStream fos = new FileOutputStream(fileLocation);
                bos = new BufferedOutputStream(fos);

                //JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
                ImageIO.write(image, "jpeg", bos);
                //encoder.encode(image);
                bos.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (bos != null) {//关闭输出流
                    try {
                        bos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) throws Exception {
        label();
    }


}